from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("Circo MCP Server")

"""
面向 circo 图形生成工具的 MCP Server

MCP tools 列表：
1. circo_version - 获取 circo 版本信息
   参数：无
   返回：包含版本信息的统一 JSON 结构

2. circo_generate_png - 生成 PNG 格式图形
   参数：input_file (str) - 输入 DOT 文件路径, output_file (str) - 输出 PNG 文件路径
   返回：命令执行结果的统一 JSON 结构

3. circo_generate_svg - 生成 SVG 格式图形  
   参数：input_file (str) - 输入 DOT 文件路径, output_file (str) - 输出 SVG 文件路径
   返回：命令执行结果的统一 JSON 结构

4. circo_generate_pdf - 生成 PDF 格式图形
   参数：input_file (str) - 输入 DOT 文件路径, output_file (str) - 输出 PDF 文件路径
   返回：命令执行结果的统一 JSON 结构

5. circo_custom_layout - 使用自定义布局选项生成图形
   参数：input_file (str) - 输入 DOT 文件路径, output_file (str) - 输出文件路径, 
         layout_options (str) - 布局选项字符串
   返回：命令执行结果的统一 JSON 结构

6. circo_help - 显示 circo 帮助信息
   参数：无
   返回：包含帮助信息的统一 JSON 结构

所有工具返回的统一 JSON 结构：
{
  "success": bool,
  "command": str, 
  "exit_code": int,
  "stdout": str,
  "stderr": str
}
"""

@mcp.tool()
def circo_version() -> dict:
    """获取 circo 版本信息
    
    返回：
        dict: 包含版本检查结果的统一 JSON 结构
    """
    try:
        result = subprocess.run(["circo", "-V"], capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": "circo -V",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "circo -V",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def circo_generate_png(input_file: str, output_file: str) -> dict:
    """使用 circo 生成 PNG 格式图形
    
    参数：
        input_file (str): 输入的 DOT 图形文件路径
        output_file (str): 输出的 PNG 文件路径
        
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        command = ["circo", "-Tpng", input_file, "-o", output_file]
        result = subprocess.run(command, capture_output=True, text=True, timeout=60)
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"circo -Tpng {input_file} -o {output_file}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def circo_generate_svg(input_file: str, output_file: str) -> dict:
    """使用 circo 生成 SVG 格式图形
    
    参数：
        input_file (str): 输入的 DOT 图形文件路径
        output_file (str): 输出的 SVG 文件路径
        
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        command = ["circo", "-Tsvg", input_file, "-o", output_file]
        result = subprocess.run(command, capture_output=True, text=True, timeout=60)
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"circo -Tsvg {input_file} -o {output_file}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def circo_generate_pdf(input_file: str, output_file: str) -> dict:
    """使用 circo 生成 PDF 格式图形
    
    参数：
        input_file (str): 输入的 DOT 图形文件路径
        output_file (str): 输出的 PDF 文件路径
        
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        command = ["circo", "-Tpdf", input_file, "-o", output_file]
        result = subprocess.run(command, capture_output=True, text=True, timeout=60)
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"circo -Tpdf {input_file} -o {output_file}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def circo_custom_layout(input_file: str, output_file: str, layout_options: str) -> dict:
    """使用 circo 自定义布局选项生成图形
    
    参数：
        input_file (str): 输入的 DOT 图形文件路径
        output_file (str): 输出文件路径
        layout_options (str): 布局选项字符串，如 "-Gstart=random"
        
    返回：
        dict: 包含命令执行结果的统一 JSON 结构
    """
    try:
        # 解析布局选项并构建命令
        options = layout_options.split()
        command = ["circo"] + options + [input_file, "-o", output_file]
        result = subprocess.run(command, capture_output=True, text=True, timeout=60)
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"circo {layout_options} {input_file} -o {output_file}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def circo_help() -> dict:
    """获取 circo 帮助信息
    
    返回：
        dict: 包含帮助信息的统一 JSON 结构
    """
    try:
        result = subprocess.run(["circo", "-?"], capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": "circo -?",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "circo -?",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()